using System;
using TimeToGo.Formatters;

namespace TimeToGo.Formatters
{
    public class RomanNumeralDurationFormatter : DurationFormatterBase
    {
        public RomanNumeralDurationFormatter(string formatString)
            : base(formatString)
        { }

        public override string Name
        {
            get { return "Roman numerals"; }
        }

        protected override string FormatDuration(TimeSpan duration)
        {
            string romanText = string.Empty;
            long number = Convert.ToInt64(duration.TotalSeconds.ToString());

            romanText = romanText + GetRomanText(ref number, 1000);
            romanText = romanText + GetRomanText(ref number, 500);
            romanText = romanText + GetRomanText(ref number, 100);
            romanText = romanText + GetRomanText(ref number, 50);
            romanText = romanText + GetRomanText(ref number, 10);
            romanText = romanText + GetRomanText(ref number, 5);
            romanText = romanText + GetRomanText(ref number, 1);

            //romanText = romanText.Replace("IIII", "IV");
            //romanText = romanText.Replace("VVVV", "IX");
            //romanText = romanText.Replace("XXXX", "XL");
            //romanText = romanText.Replace("LLLL", "LC");
            //romanText = romanText.Replace("CCCC", "CD");
            //romanText = romanText.Replace("DDDD", "DM");

            // 45
            //romanText = romanText.Replace("XXXXV", "VL");
            // 90
            //romanText = romanText.Replace("LXXXX", "XC");
            // 450
            //romanText = romanText.Replace("CCCCXXXXX", "LD");
            // 900
            //romanText = romanText.Replace("DCCCC", "CM");

            return string.Format(FormatString, romanText);
        }

        private string GetRomanText(ref long number, int romanInterval)
        {
            if (number >= romanInterval)
            {
                int count = (int)(number / romanInterval);
                string romanText = new string(GetRomanCharacter(romanInterval), count);
                number = number - romanInterval * count;
                return romanText;
            }
            return null;
        }

        private char GetRomanCharacter(int romanInterval)
        {
            if (romanInterval == 1000)
                return 'M';
            if (romanInterval == 500)
                return 'D';
            if (romanInterval == 100)
                return 'C';
            if (romanInterval == 50)
                return 'L';
            if (romanInterval == 10)
                return 'X';
            if (romanInterval == 5)
                return 'V';
            if (romanInterval == 1)
                return 'I';

            throw new ArgumentException();
        }
    }
}